home *** CD-ROM | disk | FTP | other *** search
/ Acorn RISC PD-CD 1 / Acorn RISC PD-CD 1.iso / languages / perl / usub / mus / curses < prev   
Encoding:
Text File  |  1990-08-13  |  12.3 KB  |  674 lines

  1. /* $Header: curses.mus,v 3.0.1.1 90/08/09 04:05:21 lwall Locked $
  2.  *
  3.  * $Log:    curses.mus,v $
  4.  * Revision 3.0.1.1  90/08/09  04:05:21  lwall
  5.  * patch19: Initial revision
  6.  * 
  7.  */
  8.  
  9. #include "EXTERN.h"
  10. #include "perl.h"
  11. extern int wantarray;
  12.  
  13. char *savestr();
  14.  
  15. #include <curses.h>
  16.  
  17. static enum uservars {
  18.     UV_curscr,
  19.     UV_stdscr,
  20.     UV_Def_term,
  21.     UV_My_term,
  22.     UV_ttytype,
  23.     UV_LINES,
  24.     UV_COLS,
  25.     UV_ERR,
  26.     UV_OK,
  27. };
  28.  
  29. static enum usersubs {
  30.     US_addch,
  31.     US_waddch,
  32.     US_addstr,
  33.     US_waddstr,
  34.     US_box,
  35.     US_clear,
  36.     US_wclear,
  37.     US_clearok,
  38.     US_clrtobot,
  39.     US_wclrtobot,
  40.     US_clrtoeol,
  41.     US_wclrtoeol,
  42.     US_delch,
  43.     US_wdelch,
  44.     US_deleteln,
  45.     US_wdeleteln,
  46.     US_erase,
  47.     US_werase,
  48.     US_flushok,
  49.     US_idlok,
  50.     US_insch,
  51.     US_winsch,
  52.     US_insertln,
  53.     US_winsertln,
  54.     US_move,
  55.     US_wmove,
  56.     US_overlay,
  57.     US_overwrite,
  58.     US_printw,
  59.     US_wprintw,
  60.     US_refresh,
  61.     US_wrefresh,
  62.     US_standout,
  63.     US_wstandout,
  64.     US_standend,
  65.     US_wstandend,
  66.     US_cbreak,
  67.     US_nocbreak,
  68.     US_echo,
  69.     US_noecho,
  70.     US_getch,
  71.     US_wgetch,
  72.     US_getstr,
  73.     US_wgetstr,
  74.     US_raw,
  75.     US_noraw,
  76.     US_scanw,
  77.     US_wscanw,
  78.     US_baudrate,
  79.     US_delwin,
  80.     US_endwin,
  81.     US_erasechar,
  82.     US_getcap,
  83.     US_getyx,
  84.     US_inch,
  85.     US_winch,
  86.     US_initscr,
  87.     US_killchar,
  88.     US_leaveok,
  89.     US_longname,
  90.     US_fullname,
  91.     US_mvwin,
  92.     US_newwin,
  93.     US_nl,
  94.     US_nonl,
  95.     US_scrollok,
  96.     US_subwin,
  97.     US_touchline,
  98.     US_touchoverlap,
  99.     US_touchwin,
  100.     US_unctrl,
  101.     US_gettmode,
  102.     US_mvcur,
  103.     US_scroll,
  104.     US_savetty,
  105.     US_resetty,
  106.     US_setterm,
  107.     US_tstp,
  108.     US__putchar,
  109. };
  110.  
  111. static int usersub();
  112. static int userset();
  113. static int userval();
  114.  
  115. int
  116. init_curses()
  117. {
  118.     struct ufuncs uf;
  119.     char *filename = "curses.c";
  120.  
  121.     uf.uf_set = userset;
  122.     uf.uf_val = userval;
  123.  
  124. #define MAGICVAR(name, ix) uf.uf_index = ix, magicname(name, &uf, sizeof uf)
  125.  
  126.     MAGICVAR("curscr",    UV_curscr);
  127.     MAGICVAR("stdscr",    UV_stdscr);
  128.     MAGICVAR("Def_term",UV_Def_term);
  129.     MAGICVAR("My_term",    UV_My_term);
  130.     MAGICVAR("ttytype",    UV_ttytype);
  131.     MAGICVAR("LINES",    UV_LINES);
  132.     MAGICVAR("COLS",    UV_COLS);
  133.     MAGICVAR("ERR",    UV_ERR);
  134.     MAGICVAR("OK",    UV_OK);
  135.  
  136.     make_usub("addch",        US_addch,    usersub, filename);
  137.     make_usub("waddch",        US_waddch,    usersub, filename);
  138.     make_usub("addstr",        US_addstr,    usersub, filename);
  139.     make_usub("waddstr",    US_waddstr,    usersub, filename);
  140.     make_usub("box",        US_box,        usersub, filename);
  141.     make_usub("clear",        US_clear,    usersub, filename);
  142.     make_usub("wclear",        US_wclear,    usersub, filename);
  143.     make_usub("clearok",    US_clearok,    usersub, filename);
  144.     make_usub("clrtobot",    US_clrtobot,    usersub, filename);
  145.     make_usub("wclrtobot",    US_wclrtobot,    usersub, filename);
  146.     make_usub("clrtoeol",    US_clrtoeol,    usersub, filename);
  147.     make_usub("wclrtoeol",    US_wclrtoeol,    usersub, filename);
  148.     make_usub("delch",        US_delch,    usersub, filename);
  149.     make_usub("wdelch",        US_wdelch,    usersub, filename);
  150.     make_usub("deleteln",    US_deleteln,    usersub, filename);
  151.     make_usub("wdeleteln",    US_wdeleteln,    usersub, filename);
  152.     make_usub("erase",        US_erase,    usersub, filename);
  153.     make_usub("werase",        US_werase,    usersub, filename);
  154.     make_usub("flushok",    US_flushok,    usersub, filename);
  155.     make_usub("idlok",        US_idlok,    usersub, filename);
  156.     make_usub("insch",        US_insch,    usersub, filename);
  157.     make_usub("winsch",        US_winsch,    usersub, filename);
  158.     make_usub("insertln",    US_insertln,    usersub, filename);
  159.     make_usub("winsertln",    US_winsertln,    usersub, filename);
  160.     make_usub("move",        US_move,    usersub, filename);
  161.     make_usub("wmove",        US_wmove,    usersub, filename);
  162.     make_usub("overlay",    US_overlay,    usersub, filename);
  163.     make_usub("overwrite",    US_overwrite,    usersub, filename);
  164.     make_usub("printw",        US_printw,    usersub, filename);
  165.     make_usub("wprintw",    US_wprintw,    usersub, filename);
  166.     make_usub("refresh",    US_refresh,    usersub, filename);
  167.     make_usub("wrefresh",    US_wrefresh,    usersub, filename);
  168.     make_usub("standout",    US_standout,    usersub, filename);
  169.     make_usub("wstandout",    US_wstandout,    usersub, filename);
  170.     make_usub("standend",    US_standend,    usersub, filename);
  171.     make_usub("wstandend",    US_wstandend,    usersub, filename);
  172.     make_usub("cbreak",        US_cbreak,    usersub, filename);
  173.     make_usub("nocbreak",    US_nocbreak,    usersub, filename);
  174.     make_usub("echo",        US_echo,    usersub, filename);
  175.     make_usub("noecho",        US_noecho,    usersub, filename);
  176.     make_usub("getch",        US_getch,    usersub, filename);
  177.     make_usub("wgetch",        US_wgetch,    usersub, filename);
  178.     make_usub("getstr",        US_getstr,    usersub, filename);
  179.     make_usub("wgetstr",    US_wgetstr,    usersub, filename);
  180.     make_usub("raw",        US_raw,        usersub, filename);
  181.     make_usub("noraw",        US_noraw,    usersub, filename);
  182.     make_usub("scanw",        US_scanw,    usersub, filename);
  183.     make_usub("wscanw",        US_wscanw,    usersub, filename);
  184.     make_usub("baudrate",    US_baudrate,    usersub, filename);
  185.     make_usub("delwin",        US_delwin,    usersub, filename);
  186.     make_usub("endwin",        US_endwin,    usersub, filename);
  187.     make_usub("erasechar",    US_erasechar,    usersub, filename);
  188.     make_usub("getcap",        US_getcap,    usersub, filename);
  189.     make_usub("getyx",        US_getyx,    usersub, filename);
  190.     make_usub("inch",        US_inch,    usersub, filename);
  191.     make_usub("winch",        US_winch,    usersub, filename);
  192.     make_usub("initscr",    US_initscr,    usersub, filename);
  193.     make_usub("killchar",    US_killchar,    usersub, filename);
  194.     make_usub("leaveok",    US_leaveok,    usersub, filename);
  195.     make_usub("longname",    US_longname,    usersub, filename);
  196.     make_usub("fullname",    US_fullname,    usersub, filename);
  197.     make_usub("mvwin",        US_mvwin,    usersub, filename);
  198.     make_usub("newwin",        US_newwin,    usersub, filename);
  199.     make_usub("nl",        US_nl,        usersub, filename);
  200.     make_usub("nonl",        US_nonl,    usersub, filename);
  201.     make_usub("scrollok",    US_scrollok,    usersub, filename);
  202.     make_usub("subwin",        US_subwin,    usersub, filename);
  203.     make_usub("touchline",    US_touchline,    usersub, filename);
  204.     make_usub("touchoverlap",    US_touchoverlap,usersub, filename);
  205.     make_usub("touchwin",    US_touchwin,    usersub, filename);
  206.     make_usub("unctrl",        US_unctrl,    usersub, filename);
  207.     make_usub("gettmode",    US_gettmode,    usersub, filename);
  208.     make_usub("mvcur",        US_mvcur,    usersub, filename);
  209.     make_usub("scroll",        US_scroll,    usersub, filename);
  210.     make_usub("savetty",    US_savetty,    usersub, filename);
  211.     make_usub("resetty",    US_resetty,    usersub, filename);
  212.     make_usub("setterm",    US_setterm,    usersub, filename);
  213.     make_usub("tstp",        US_tstp,    usersub, filename);
  214.     make_usub("_putchar",    US__putchar,    usersub, filename);
  215. };
  216.  
  217. static int
  218. usersub(ix, sp, items)
  219. int ix;
  220. register int sp;
  221. register int items;
  222. {
  223.     STR **st = stack->ary_array + sp;
  224.     register int i;
  225.     register char *tmps;
  226.     register STR *Str;        /* used in str_get and str_gnum macros */
  227.  
  228.     switch (ix) {
  229. CASE int addch
  230. I    char        ch
  231. END
  232.  
  233. CASE int waddch
  234. I    WINDOW*        win
  235. I    char        ch
  236. END
  237.  
  238. CASE int addstr
  239. I    char*        str
  240. END
  241.  
  242. CASE int waddstr
  243. I    WINDOW*        win
  244. I    char*        str
  245. END
  246.  
  247. CASE int box
  248. I    WINDOW*        win
  249. I    char        vert
  250. I    char        hor
  251. END
  252.  
  253. CASE int clear
  254. END
  255.  
  256. CASE int wclear
  257. I    WINDOW*        win
  258. END
  259.  
  260. CASE int clearok
  261. I    WINDOW*        win
  262. I    bool        boolf
  263. END
  264.  
  265. CASE int clrtobot
  266. END
  267.  
  268. CASE int wclrtobot
  269. I    WINDOW*        win
  270. END
  271.  
  272. CASE int clrtoeol
  273. END
  274.  
  275. CASE int wclrtoeol
  276. I    WINDOW*        win
  277. END
  278.  
  279. CASE int delch
  280. END
  281.  
  282. CASE int wdelch
  283. I    WINDOW*        win
  284. END
  285.  
  286. CASE int deleteln
  287. END
  288.  
  289. CASE int wdeleteln
  290. I    WINDOW*        win
  291. END
  292.  
  293. CASE int erase
  294. END
  295.  
  296. CASE int werase
  297. I    WINDOW*        win
  298. END
  299.  
  300. CASE int flushok
  301. I    WINDOW*        win
  302. I    bool        boolf
  303. END
  304.  
  305. CASE int idlok
  306. I    WINDOW*        win
  307. I    bool        boolf
  308. END
  309.  
  310. CASE int insch
  311. I    char        c
  312. END
  313.  
  314. CASE int winsch
  315. I    WINDOW*        win
  316. I    char        c
  317. END
  318.  
  319. CASE int insertln
  320. END
  321.  
  322. CASE int winsertln
  323. I    WINDOW*        win
  324. END
  325.  
  326. CASE int move
  327. I    int        y
  328. I    int        x
  329. END
  330.  
  331. CASE int wmove
  332. I    WINDOW*        win
  333. I    int        y
  334. I    int        x
  335. END
  336.  
  337. CASE int overlay
  338. I    WINDOW*        win1
  339. I    WINDOW*        win2
  340. END
  341.  
  342. CASE int overwrite
  343. I    WINDOW*        win1
  344. I    WINDOW*        win2
  345. END
  346.  
  347.     case US_printw:
  348.     if (items < 1)
  349.         fatal("Usage: &printw($fmt, $arg1, $arg2, ... )");
  350.     else {
  351.         int retval;
  352.         STR*    str =        str_new(0);
  353.  
  354.         do_sprintf(str, items - 1, st + 1);
  355.         retval = addstr(str->str_ptr);
  356.         str_numset(st[0], (double) retval);
  357.         str_free(str);
  358.     }
  359.     return sp;
  360.  
  361.     case US_wprintw:
  362.     if (items < 2)
  363.         fatal("Usage: &wprintw($win, $fmt, $arg1, $arg2, ... )");
  364.     else {
  365.         int retval;
  366.         STR*    str =        str_new(0);
  367.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  368.  
  369.         do_sprintf(str, items - 1, st + 1);
  370.         retval = waddstr(win, str->str_ptr);
  371.         str_numset(st[0], (double) retval);
  372.         str_free(str);
  373.     }
  374.     return sp;
  375.  
  376. CASE int refresh
  377. END
  378.  
  379. CASE int wrefresh
  380. I    WINDOW*        win
  381. END
  382.  
  383. CASE int standout
  384. END
  385.  
  386. CASE int wstandout
  387. I    WINDOW*        win
  388. END
  389.  
  390. CASE int standend
  391. END
  392.  
  393. CASE int wstandend
  394. I    WINDOW*        win
  395. END
  396.  
  397. CASE int cbreak
  398. END
  399.  
  400. CASE int nocbreak
  401. END
  402.  
  403. CASE int echo
  404. END
  405.  
  406. CASE int noecho
  407. END
  408.  
  409.     case US_getch:
  410.         if (items != 0)
  411.             fatal("Usage: &getch()");
  412.         else {
  413.             int retval;
  414.         char retch;
  415.  
  416.             retval = getch();
  417.         if (retval == EOF)
  418.         st[0] = &str_undef;
  419.         else {
  420.         retch = retval;
  421.         str_nset(st[0], &retch, 1);
  422.         }
  423.         }
  424.         return sp;
  425.  
  426.     case US_wgetch:
  427.         if (items != 1)
  428.             fatal("Usage: &wgetch($win)");
  429.         else {
  430.             int retval;
  431.         char retch;
  432.             WINDOW*     win =           *(WINDOW**)     str_get(st[1]);
  433.  
  434.             retval = wgetch(win);
  435.         if (retval == EOF)
  436.         st[0] = &str_undef;
  437.         else {
  438.         retch = retval;
  439.         str_nset(st[0], &retch, 1);
  440.         }
  441.         }
  442.         return sp;
  443.  
  444. CASE int getstr
  445. IO    char*        str
  446. END
  447.  
  448. CASE int wgetstr
  449. I    WINDOW*        win
  450. IO    char*        str
  451. END
  452.  
  453. CASE int raw
  454. END
  455.  
  456. CASE int noraw
  457. END
  458.  
  459. CASE int baudrate
  460. END
  461.  
  462. CASE int delwin
  463. I    WINDOW*        win
  464. END
  465.  
  466. CASE int endwin
  467. END
  468.  
  469. CASE int erasechar
  470. END
  471.  
  472. CASE char* getcap
  473. I    char*        str
  474. END
  475.  
  476.     case US_getyx:
  477.     if (items != 3)
  478.         fatal("Usage: &getyx($win, $y, $x)");
  479.     else {
  480.         int retval;
  481.         STR*    str =        str_new(0);
  482.         WINDOW*    win =        *(WINDOW**)    str_get(st[1]);
  483.         int        y;
  484.         int        x;
  485.  
  486.         do_sprintf(str, items - 1, st + 1);
  487.         retval = getyx(win, y, x);
  488.         str_numset(st[2], (double)y);
  489.         str_numset(st[3], (double)x);
  490.         str_numset(st[0], (double) retval);
  491.         str_free(str);
  492.     }
  493.     return sp;
  494.  
  495.     
  496. CASE int inch
  497. END
  498.  
  499. CASE int winch
  500. I    WINDOW*        win
  501. END
  502.  
  503. CASE WINDOW* initscr
  504. END
  505.  
  506. CASE int killchar
  507. END
  508.  
  509. CASE int leaveok
  510. I    WINDOW*        win
  511. I    bool        boolf
  512. END
  513.  
  514. CASE char* longname
  515. I    char*        termbuf
  516. IO    char*        name
  517. END
  518.  
  519. CASE int fullname
  520. I    char*        termbuf
  521. IO    char*        name
  522. END
  523.  
  524. CASE int mvwin
  525. I    WINDOW*        win
  526. I    int        y
  527. I    int        x
  528. END
  529.  
  530. CASE WINDOW* newwin
  531. I    int        lines
  532. I    int        cols
  533. I    int        begin_y
  534. I    int        begin_x
  535. END
  536.  
  537. CASE int nl
  538. END
  539.  
  540. CASE int nonl
  541. END
  542.  
  543. CASE int scrollok
  544. I    WINDOW*        win
  545. I    bool        boolf
  546. END
  547.  
  548. CASE WINDOW* subwin
  549. I    WINDOW*        win
  550. I    int        lines
  551. I    int        cols
  552. I    int        begin_y
  553. I    int        begin_x
  554. END
  555.  
  556. CASE int touchline
  557. I    WINDOW*        win
  558. I    int        y
  559. I    int        startx
  560. I    int        endx
  561. END
  562.  
  563. CASE int touchoverlap
  564. I    WINDOW*        win1
  565. I    WINDOW*        win2
  566. END
  567.  
  568. CASE int touchwin
  569. I    WINDOW*        win
  570. END
  571.  
  572. CASE char* unctrl
  573. I    char        ch
  574. END
  575.  
  576. CASE int gettmode
  577. END
  578.  
  579. CASE int mvcur
  580. I    int        lasty
  581. I    int        lastx
  582. I    int        newy
  583. I    int        newx
  584. END
  585.  
  586. CASE int scroll
  587. I    WINDOW*        win
  588. END
  589.  
  590. CASE int savetty
  591. END
  592.  
  593. CASE void resetty
  594. END
  595.  
  596. CASE int setterm
  597. I    char*        name
  598. END
  599.  
  600. CASE int tstp
  601. END
  602.  
  603. CASE int _putchar
  604. I    char        ch
  605. END
  606.  
  607.     default:
  608.     fatal("Unimplemented user-defined subroutine");
  609.     }
  610.     return sp;
  611. }
  612.  
  613. static int
  614. userval(ix, str)
  615. int ix;
  616. STR *str;
  617. {
  618.     switch (ix) {
  619.     case UV_COLS:
  620.     str_numset(str, (double)COLS);
  621.     break;
  622.     case UV_Def_term:
  623.     str_set(str, Def_term);
  624.     break;
  625.     case UV_ERR:
  626.     str_numset(str, (double)ERR);
  627.     break;
  628.     case UV_LINES:
  629.     str_numset(str, (double)LINES);
  630.     break;
  631.     case UV_My_term:
  632.     str_numset(str, (double)My_term);
  633.     break;
  634.     case UV_OK:
  635.     str_numset(str, (double)OK);
  636.     break;
  637.     case UV_curscr:
  638.     str_nset(str, &curscr, sizeof(WINDOW*));
  639.     break;
  640.     case UV_stdscr:
  641.     str_nset(str, &stdscr, sizeof(WINDOW*));
  642.     break;
  643.     case UV_ttytype:
  644.     str_set(str, ttytype);
  645.     break;
  646.     }
  647.     return 0;
  648. }
  649.  
  650. static int
  651. userset(ix, str)
  652. int ix;
  653. STR *str;
  654. {
  655.     switch (ix) {
  656.     case UV_COLS:
  657.     COLS = (int)str_gnum(str);
  658.     break;
  659.     case UV_Def_term:
  660.     Def_term = savestr(str_get(str));    /* never freed */
  661.     break;
  662.     case UV_LINES:
  663.     LINES = (int)str_gnum(str);
  664.     break;
  665.     case UV_My_term:
  666.     My_term = (bool)str_gnum(str);
  667.     break;
  668.     case UV_ttytype:
  669.     strcpy(ttytype, str_get(str));        /* hope it fits */
  670.     break;
  671.     }
  672.     return 0;
  673. }
  674.